123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- Shader "Hidden/FlatKit/FogFilter"
- {
- Properties
- {
- [Toggle(USE_DISTANCE_FOG)]_UseDistanceFog ("Use Distance", Float) = 0
- [Toggle(USE_DISTANCE_FOG_ON_SKY)]_UseDistanceFogOnSky ("Use Distance Fog On Sky", Float) = 0
- [Space]
- _Near ("Near", Float) = 0
- _Far ("Far", Float) = 100
- [Space]
- _DistanceFogIntensity ("Distance Fog Intensity", Range(0, 1)) = 1
- [Space(25)]
- [Toggle(USE_HEGHT_FOG)]_UseHeightFog ("Use Height", Float) = 0
- [Toggle(USE_HEGHT_FOG_ON_SKY)]_UseHeightFogOnSky ("Use Height Fog On Sky", Float) = 0
- [Space]
- _LowWorldY ("Low", Float) = 0
- _HighWorldY ("High", Float) = 10
- [Space]
- _HeightFogIntensity ("Height Fog Intensity", Range(0, 1)) = 1
- [Space(25)]
- _DistanceHeightBlend ("Distance / Height blend", Range(0, 1)) = 0.5
- }
- SubShader
- {
- Tags
- {
- "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"
- }
- LOD 100
- ZWrite Off Cull Off
- Pass
- {
- Name "Fog"
- HLSLPROGRAM
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl"
- #pragma multi_compile _ _USE_DRAW_PROCEDURAL
- sampler2D _DistanceLUT;
- float _Near;
- float _Far;
- half _UseDistanceFog;
- half _UseDistanceFogOnSky;
- sampler2D _HeightLUT;
- float _LowWorldY;
- float _HighWorldY;
- half _UseHeightFog;
- half _UseHeightFogOnSky;
- float _DistanceFogIntensity;
- float _HeightFogIntensity;
- float _DistanceHeightBlend;
- #define ALMOST_ONE 0.999
- // Using `_CameraColorTexture` instead of the opaque texture `SampleSceneColor` to handle transparency.
- TEXTURE2D_X(_CameraColorTexture);
- SAMPLER(sampler_CameraColorTexture);
- float4 _CameraColorTexture_TexelSize;
- // Z buffer depth to linear 0-1 depth
- // Handles orthographic projection correctly
- float Linear01Depth(float z)
- {
- float isOrtho = unity_OrthoParams.w;
- float isPers = 1.0 - unity_OrthoParams.w;
- z *= _ZBufferParams.x;
- return (1.0 - isOrtho * z) / (isPers * z + _ZBufferParams.y);
- }
- float4 SampleCameraColor(float2 uv)
- {
- return SAMPLE_TEXTURE2D_X(_CameraColorTexture, sampler_CameraColorTexture, UnityStereoTransformScreenSpaceTex(uv));
- }
- float LinearEyeDepth(float z)
- {
- return rcp(_ZBufferParams.z * z + _ZBufferParams.w);
- }
- float4 Fog(float2 uv, float3 screen_pos)
- {
- float4 original = SampleCameraColor(uv);
- const float depthPacked = SampleSceneDepth(uv);
- const float depthEye = LinearEyeDepth(depthPacked);
- const float depthCameraPlanes = Linear01Depth(depthPacked);
- const float depthAbsolute = _ProjectionParams.y + (_ProjectionParams.z - _ProjectionParams.y) *
- depthCameraPlanes;
- const float depthFogPlanes = saturate((depthAbsolute - _Near) / (_Far - _Near));
- const float isSky = step(ALMOST_ONE, depthCameraPlanes);
- float4 distanceFog = tex2D(_DistanceLUT, float2(depthFogPlanes, 0.5));
- distanceFog.a *= step(isSky, _UseDistanceFogOnSky);
- distanceFog.a *= _UseDistanceFog * _DistanceFogIntensity;
- const float3 worldPos = screen_pos * depthEye + _WorldSpaceCameraPos;
- const float heightUV = saturate((worldPos.y - _LowWorldY) / (_HighWorldY - _LowWorldY));
- float4 heightFog = tex2D(_HeightLUT, float2(heightUV, 0.5));
- heightFog.a *= step(isSky, _UseHeightFogOnSky);
- heightFog.a *= _UseHeightFog * _HeightFogIntensity;
- float fogBlend = _DistanceHeightBlend;
- if (!_UseDistanceFog) fogBlend = 1.0;
- if (!_UseHeightFog) fogBlend = 0.0;
- const float4 fog = lerp(distanceFog, heightFog, fogBlend);
- float4 final = lerp(original, fog, fog.a);
- final.a = original.a;
- return final;
- }
- struct Attributes
- {
- float4 positionOS: POSITION;
- float2 uv: TEXCOORD0;
-
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
- struct Varyings
- {
- float2 uv: TEXCOORD0;
- float3 screen_pos: TEXCOORD1;
- float4 vertex: SV_POSITION;
-
- UNITY_VERTEX_OUTPUT_STEREO
- };
- Varyings vert(Attributes input)
- {
- Varyings output = (Varyings)0;
-
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
- #if _USE_DRAW_PROCEDURAL
- output.vertex = float4(input.positionOS.xyz, 1.0);
- #if UNITY_UV_STARTS_AT_TOP
- output.vertex.y *= -1;
- #endif
- #else
- const VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
- output.vertex = vertexInput.positionCS;
- #endif
- output.uv = input.uv;
- output.screen_pos = ComputeScreenPos(output.vertex).xyz;
- return output;
- }
- half4 frag(Varyings input): SV_Target
- {
- UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
- float4 c = Fog(input.uv, input.screen_pos);
- return c;
- }
- #pragma vertex vert
- #pragma fragment frag
- ENDHLSL
- }
- }
- FallBack "Diffuse"
- }
|